package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main() {
	/* 整数 */
	var (
		i    int
		i8   int8
		i16  int16
		i32  int32
		i64  int64
		ui   uint
		ui8  uint8
		ui16 uint16
		ui32 uint32
		ui64 uint64
	)

	fmt.Printf("%T\t%dB\t%v~%v\n", i, unsafe.Sizeof(i), math.MinInt, math.MaxInt)
	fmt.Printf("%T\t%dB\t%v~%v\n", i8, unsafe.Sizeof(i8), math.MinInt8, math.MaxInt8)
	fmt.Printf("%T\t%dB\t%v~%v\n", i16, unsafe.Sizeof(i16), math.MinInt16, math.MaxInt16)
	fmt.Printf("%T\t%dB\t%v~%v\n", i32, unsafe.Sizeof(i32), math.MinInt32, math.MaxInt32)
	fmt.Printf("%T\t%dB\t%v~%v\n", i64, unsafe.Sizeof(i64), math.MinInt64, math.MaxInt64)
	fmt.Printf("%T\t%dB\t%v~%v\n", ui, unsafe.Sizeof(ui), 0, uint(math.MaxUint))
	fmt.Printf("%T\t%dB\t%v~%v\n", ui8, unsafe.Sizeof(ui8), 0, math.MaxUint8)
	fmt.Printf("%T\t%dB\t%v~%v\n", ui16, unsafe.Sizeof(ui16), 0, math.MaxUint16)
	fmt.Printf("%T\t%dB\t%v~%v\n", ui32, unsafe.Sizeof(ui32), 0, math.MaxUint32)
	fmt.Printf("%T\t%dB\t%v~%v\n", ui64, unsafe.Sizeof(ui64), 0, uint64(math.MaxUint64))

	/* 浮点数 */
	var (
		f32 float32
		f64 float64
	)
	fmt.Printf("%T\t%dB\t%v~%v\n", f32, unsafe.Sizeof(f32), -math.MaxFloat32, math.MaxFloat32)
	fmt.Printf("%T\t%dB\t%v~%v\n", f64, unsafe.Sizeof(f64), -math.MaxFloat64, math.MaxFloat64)

	/* 整数格式化输出 */
	// 默认使用 十进制
	a := 10
	fmt.Printf("a: %d \n", a) // %d 以 十进制 格式输出，输出结果：10
	fmt.Printf("a: %b\n", a)  // %b 以 二进制 格式输出，输出结果：1010

	// 八进制 整数以 0 开头
	b := 012
	fmt.Printf("b: %d \n", b) // %d 以 十进制 格式输出，输出结果：10
	fmt.Printf("b: %b\n", b)  // %b 以 二进制 格式输出，输出结果：1010
	fmt.Printf("b: %o\n", b)  // %o 以 八进制 格式输出，输出结果：12

	// 十六进制 整数以 0x 开头
	c := 0xa
	fmt.Printf("c: %d \n", c) // %d 以 十进制 格式输出，输出结果：10
	fmt.Printf("c: %b\n", c)  // %b 以 二进制 格式输出，输出结果：1010
	fmt.Printf("c: %o\n", c)  // %o 以 八进制 格式输出，输出结果：12
	fmt.Printf("c: %x\n", c)  // %x 以 十六进制 小写格式输出，输出结果：a
	fmt.Printf("c: %X\n", c)  // %X 以 十六进制 大写格式输出，输出结果：A

	/* 浮点数格式化输出 */
	// Pi  = 3.14159265358979323846264338327950288419716939937510582097494459
	// https://oeis.org/A000796
	fmt.Printf("Pi: %f\n", math.Pi)    // 保留 6 位有效数字
	fmt.Printf("Pi: %.2f\n", math.Pi)  // 保留 2 位有效数字
	fmt.Printf("Pi: %.10f\n", math.Pi) // 保留 10 位有效数字

	/* 复数 */
	var (
		c1 complex64  = 1 + 2i
		c2 complex128 = 1 + 3i
	)
	fmt.Printf("c1: %v\n", c1)
	fmt.Printf("c2: %v\n", c2)

}
